package cgs

import (
	"cgs-server/pkg/set"
	"cgs-server/server/model"
	"errors"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"regexp"
	"time"
)

var sceneIdRex = regexp.MustCompile(`.*sceneID\s*:\s*['|"](\w*)['|"]`)
var formIdRex = regexp.MustCompile(`"formID"\s*:\s*"(\w*)"`)

type CgsProj struct {
	// ID
	ID primitive.ObjectID `json:"ID" bson:"ID"`
	// Name
	Name     string `json:"Name" bson:"Name"`
	ParentId string `json:"ParentId" bson:"ParentId"`
	//F or D(File or Director)
	FileType string `json:"FileType" bson:"FileType"`
	Public   *bool  `json:"Public" bson:"IsPublic"`
	JsPath   string `json:"JsPath" bson:"JsPath"`     //old path
	FilePath string `json:"FilePath" bson:"FilePath"` //new path
	// Create Time
	Data string `json:"Data" bson:"Data"`
	// Update Time
	UpdateTime time.Time `json:"-" bson:"-"`
	// Published id
	PublishId string `json:"PublishId" bson:"PublishId"`
	// SceneId
	SceneId string `json:"sceneId" bson:"sceneId"`
	// SceneId
	Type string `json:"type" bson:"type"`

	model.TenantModel `json:",inline" bson:",inline"`
}

func (c *CgsProj) SetId(id primitive.ObjectID) {
	c.ID = id
}
func (c *CgsProj) GetId() string {
	return c.ID.Hex()
}

// 获取 sceneId
func (c *CgsProj) GetSceneId() (string, error) {
	//if c.SceneId != "" {
	//	return c.SceneId, nil
	//}
	sceneID := sceneIdRex.FindStringSubmatch(c.Data)
	if len(sceneID) < 2 {
		return "", errors.New("SceneId not find")
	}
	return sceneID[1], nil
}

// 以集合的形式返回 config.json 文件中包含的 formID
func (c *CgsProj) GetFormIds(configJson string) set.Set {
	result := formIdRex.FindAllStringSubmatch(configJson, -1)
	formIdSet := set.NewSet()
	for i := range result {
		if len(result[i]) == 2 {
			formIdSet.Add(result[i][1])
		}
	}

	return formIdSet
}

type CgsAddModel struct {
	CgsProj
	model.BaseModel
	IDObjId primitive.ObjectID
}

type CgsProjectConfig struct {
	SceneID string // 场景id
	AppID   string // 应用 id
}
